# coding:utf8
import requests
import yaml
from pathlib import Path

# 定义函数load_config，用于从配置文件中加载钉钉相关配置信息，并以字典形式返回
def load_config():
    """
    从配置文件中加载钉钉相关配置
    :return: 钉钉配置信息的字典
    """
    # 创建一个Path对象，指向名为"config.yaml"的文件，用于后续操作中准确找到配置文件的位置
    config_path = Path("config.yaml")
    # 使用with语句打开配置文件，'r'表示以只读模式打开，确保文件操作的安全性和规范性
    with config_path.open('r') as f:
        # 使用yaml库的safe_load方法加载配置文件内容，该方法会将YAML格式的数据解析为Python对象（在这里期望解析为字典类型）
        config = yaml.safe_load(f)
    # 从解析后的配置数据（字典）中获取键为'dingtalk'的值，如果不存在'dingtalk'键，则返回一个空字典。
    # 这样做的目的是提取出与钉钉相关的配置信息部分，方便后续使用
    return config.get('dingtalk', {})


# 定义函数send_dingtalk_notification，用于向钉钉发送通知消息，参数message为要发送的具体消息内容
def send_dingtalk_notification(message):
    """
    向钉钉发送通知消息
    :param message: 要发送的消息内容
    """
    # 调用load_config函数获取整个项目的配置信息，并从中提取出钉钉相关配置，存储在config变量中，此处的config应为字典类型
    config = load_config()
    # 从钉钉配置字典中获取'webhook'键对应的值，这个'webhook'值通常是一个URL地址，用于指定钉钉机器人接收消息的接口
    webhook = config.get('webhook')
    # 判断webhook是否存在（即是否配置了有效的钉钉机器人webhook地址），如果存在则进行发送消息的操作
    if webhook:
        # 构造要发送给钉钉机器人的消息数据格式，这里设置消息类型为'text'（文本类型），并将传入的message参数作为文本内容放入字典中
        data = {"msgtype": "text", "text": {"content": message}}
        # 使用requests库的post方法向钉钉机器人的webhook地址发送POST请求，将构造好的消息数据以JSON格式发送出去
        try:
            requests.post(webhook, json=data)
        # 如果在发送请求过程中出现RequestException类型的异常（比如网络连接问题、请求被拒绝等情况），则捕获异常并打印出相应的错误信息
        except requests.RequestException as e:
            print(f"钉钉通知发送失败: {e}")
    # 如果没有配置有效的webhook地址，就打印提示信息，告知无法发送通知
    else:
        print("未配置钉钉webhook地址，无法发送通知")